package main

import (
	"fmt"
	"math/rand"
)

// 1、有4个数字1、2、3、4，能组成多少个不重复的3位数，请打印出来。
// 要求这个3位数不同位不能使用相同数字，例如112、212就不可以。
func combine() {
	nums := []int{1, 2, 3, 4}
	combines := [][3]int{}
	for i := 0; i < len(nums); i++ {
		temp := [3]int{}
		temp[0] = nums[i]
		newSlice := []int{}
		newSlice = append(newSlice, nums[0:i]...)
		newSlice = append(newSlice, nums[i+1:]...)
		for j := 0; j < len(newSlice); j++ {
			temp[1] = newSlice[j]
			newSlice1 := []int{}
			newSlice1 = append(newSlice1, newSlice[0:j]...)
			newSlice1 = append(newSlice1, newSlice[j+1:]...)
			for k := 0; k < len(newSlice1); k++ {
				temp[2] = newSlice1[k]
				combines = append(combines, temp)
			}
		}
	}
	for _, v := range combines {
		fmt.Println(v[0]*100 + v[1]*10 + v[2])
	}
}

// 2、使用英文小写字母随机生成一个大于3个字符的字符串并打印，请再把这个字符串逆序打印出来
func testQ2() {
	length := 5
	s := randString(length)
	fmt.Println(s)
	b := []byte(s)
	reverse := make([]byte, 0, length)
	for i := 0; i < length; i++ {
		reverse = append(reverse, b[length-1-i])
	}
	fmt.Println(string(reverse))
}

func randString(length int) string {
	res := make([]rune, 0, length)
	s := 'a'
	for i := 0; i < length; i++ {
		res = append(res, s+rune(rand.Intn(26)))
	}
	return string(res)
}

// 3、合并字符串
// 给出2个英文小写字符串，依次字符交叉合并成新字符串，多出的部分追加在新字符串末尾。
// 例如：
// abc、xyz => axbycz
// ab、xyz => axbyz
// abcd、xy => axbycd
func combineTwoString(x, y string) string {
	x1 := []byte(x)
	y1 := []byte(y)
	lx1 := len(x1)
	ly1 := len(y1)
	minLength := min(lx1, ly1)
	res := make([]byte, 0, lx1+ly1)
	for i := 0; i < minLength; i++ {
		res = append(res, x1[i], y1[i])
	}
	if lx1 > ly1 {
		res = append(res, x1[minLength:]...)
	} else {
		res = append(res, y1[minLength:]...)
	}
	return string(res)
}
